package com.example.springboot.config.tomcat;


import org.apache.tomcat.util.threads.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;


/**
 * tomcat 如何优化线程池，核心在于阻塞队列的实现，因为阻塞队列满了才会继续创建非核心 worker 线程处理任务
 * （1）运行的线程数小于核心线程，就创建一个 worker 线程去执行任务
 * （2）当前已经创建的核心+非核心线程数等于最大线程数，任务压入队列
 * （3）正在处理的请求数量小于核心+非核心线程数，任务压入队列
 * （4）当前已经创建的核心+非核心线程数小于最大线程数，创建 worker 线程处理请求
 * 总结就是一句话当高并发流量过来的时候，会去创建最大线程数的 worker 去处理请求用以降低尾延迟，超过最大线程后，任务将被压入队列中进行处理
 *
 * @Author:ChenZhangKun
 * @Date: 2022/9/9 13:55
 */
@Configuration
public class TomcatConfig {
    @Bean
    public MyTomcatProtocolHandlerCustomizer myTomcatProtocolHandlerCustomizer() {
        return new MyTomcatProtocolHandlerCustomizer(new ThreadPoolExecutor(
                50,
                50,
                100L,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(),
                new ThreadFactory() {
                    @Override
                    public Thread newThread(Runnable r) {
                        return new Thread(r);
                    }
                },
                new RejectedExecutionHandler() {
                    @Override
                    public void rejectedExecution(Runnable r, java.util.concurrent.ThreadPoolExecutor executor) {
                        throw new RuntimeException("线程池满了");
                    }
                }
        ));
    }
}
